iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Mobile Development

手機Swift性能專家系列 第 24

Publisher和AnyCancellable

  • 分享至 

  • xImage
  •  

Publisher

在 Combine 框架中,Publisher 是一個協議,它代表了一個能夠發佈數據和事件的類型。Publisher 可以發出三種事件:

  1. 數據事件(Output):這是 Publisher 發出的主要數據,可以是一個單獨的值或一系列值。
  2. 完成事件(Completion):當 Publisher 正常完成數據發佈時發出。
  3. 錯誤事件(Failure):當 Publisher 發生錯誤時發出,並結束數據發佈。

Publisher 有以下特點和使用場景:

  • 流式數據處理:Publisher 用於流式傳輸數據,允許處理異步事件序列。
  • 鏈式操作:Publisher 支援多種操作符(Operators),讓我們能夠進行數據轉換、過濾、合併等操作。例如 mapfiltermerge 等。
  • 訂閱機制:Subscriber 訂閱 Publisher 來接收數據。一旦訂閱,Subscriber 就可以處理來自 Publisher 的所有輸出事件、完成事件及錯誤事件。

簡單例子:

import Combine

let myPublisher = Just("Hello, Combine!")
myPublisher
    .sink(receiveCompletion: { completion in
        print("Completed with \(completion)")
    }, receiveValue: { value in
        print("Received value: \(value)")
    })

此例中,Just 是一個 Publisher,會立即發佈一個值並完成。

AnyCancellable

AnyCancellable 是 Combine 框架中的一個類別,它用來掌控和取消 Publisher 和 Subscriber 之間的訂閱關係。其主要用途如下:

  1. 管理訂閱的生命週期:當 AnyCancellable 實例被釋放時,它會自動取消對應的訂閱,這有助於防止記憶體洩漏。
  2. 保證訂閱的取消:可以手動調用 cancel() 方法來取消訂閱。
  3. 結合 Swift 的記憶管理:通常將 AnyCancellable 存儲在一個集合或其他容器中,以便在適當的時候取消訂閱。

示例:

import Combine

var cancellables = Set<AnyCancellable>()

let myPublisher = Just("Hello, Combine!")
myPublisher
    .sink(receiveCompletion: { completion in
        print("Completed with \(completion)")
    }, receiveValue: { value in
        print("Received value: \(value)")
    })
    .store(in: &cancellables)

在這個例子中,store(in: &cancellables) 將返回的 AnyCancellable 實例存儲在 Set 中,確保在需要時能夠取消訂閱。

總結

  • Publisher 是 Combine 框架中的核心概念,用於發佈數據流,可以發出數據事件、完成事件和錯誤事件。
  • AnyCancellable 用於管理和取消訂閱,確保資源的有效利用及防止記憶體洩漏。

上一篇
Operators介紹
下一篇
swift 3D圖加載SceneKit
系列文
手機Swift性能專家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言